home *** CD-ROM | disk | FTP | other *** search
/ Shareware Super Platinum 8 / Shareware Super Platinum 8.iso / mac / PROGTOOL / FLI106C.ZIP;1 / WINMAN.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  1992-03-12  |  19.5 KB  |  703 lines

  1. //
  2. // The Fusion Library Interface for DOS
  3. // Version 1.06c
  4. // Copyright (C) 1990, 1991, 1992
  5. // Software Dimensions
  6. //
  7. // MenuManager
  8. //
  9.  
  10. #include "fliwin.h"
  11.  
  12. #ifdef __BCPLUSPLUS__
  13. #pragma hdrstop
  14. #endif
  15.  
  16. #include <alloc.h>
  17. #include <string.h>
  18. #include <ctype.h>
  19.  
  20. int MenuManager::IsPullDown=0;
  21. int MenuManager::Beneath=1;
  22.  
  23. void MenuManager::MenuPullDown() { IsPullDown=1; }
  24. void MenuManager::MenuPopDown() { IsPullDown=0; }
  25. void MenuManager::SubMenuRight() { Beneath=0; }
  26. void MenuManager::SubMenuBeneath() { Beneath=1; }
  27.  
  28. //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  29. //
  30. // MenuManager()
  31. //
  32. // Constructor for MenuManager class
  33. //
  34. //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  35.  
  36. MenuManager::MenuManager()
  37. {
  38.   Menus=0;
  39.   SubMenuTrack=0;
  40.   NumberOfMenus=0;
  41.   CurrentLevel=0;
  42.   SetX=0;
  43.   SetY=0;
  44.   MouseInControl=1;
  45.   StowedWidth=0;
  46. }
  47.  
  48. //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  49. //
  50. // ~MenuManager()
  51. //
  52. // Destructor for MenuManager class
  53. //
  54. //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  55.  
  56. MenuManager::~MenuManager()
  57. {
  58.   RemoveAllMenus();
  59.  
  60.   if (NumberOfMenus)
  61.   {
  62.     for (int i=0;i<NumberOfMenus;i++)
  63.       delete Menus[i];
  64.   }
  65.   free(Menus);
  66. }
  67.  
  68. //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  69. //
  70. // Manager()
  71. //
  72. // Constructor for MenuItems class
  73. //
  74. //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  75.  
  76. int MenuManager::Manager(int Event,int IsWindow,int NumberOfWindows,
  77.   WindowElement &Window,FusionWindow &WorkSpace)
  78. {
  79.   int WasRemoved=0;
  80.  
  81.   if (Event==MousedEvent)
  82.   {
  83.     //--------------------------------------------------------------
  84.     //
  85.     // Pop down Mouse controller
  86.     //
  87.     //--------------------------------------------------------------
  88.  
  89.     if (!IsPullDown)
  90.     {
  91.       if (!CurrentLevel)
  92.         MouseInControl=1;
  93.  
  94.       MenuItems &Menu=*SubMenuTrack[CurrentLevel-1];
  95.  
  96.       if (MouseEvent&MouseLeftButtonRelease && CurrentLevel==1 &&
  97.         !Menu.NumberOfOptions && MouseHorizontal>=Menu.XStart
  98.         && MouseHorizontal<=Menu.XEnd && MouseVertical==SetY
  99.         && Menu.MenuEvent)
  100.       {
  101.         RemoveMenu();
  102.         return(Menu.MenuEvent);
  103.       }
  104.  
  105.       if (!MouseInControl && CurrentLevel)
  106.       {
  107.         if (MouseHorizontal>=Menu.X
  108.             && MouseHorizontal<Menu.X+Menu.Width
  109.             && MouseVertical>Menu.Y
  110.             && MouseVertical<Menu.Y+Menu.Height-1)
  111.         {
  112.           MouseInControl=1;
  113.           RemoveOption();
  114.           PlaceOption(MouseVertical-Menu.Y-1);
  115.           return MenuEvent;
  116.         }
  117.  
  118.         if (MouseEvent&MouseLeftButtonRelease || MouseEvent&MouseLeftButtonPress)
  119.         {
  120.           if (CurrentLevel==1)
  121.           {
  122.             if ( ((MouseHorizontal<Menu.XStart ||
  123.                    MouseHorizontal>Menu.XEnd) &&
  124.                    MouseVertical==SetY &&
  125.                    SetY<Menu.Y)
  126.  
  127.                    ||
  128.  
  129.                  ((MouseHorizontal<Menu.X ||
  130.                    MouseHorizontal>=Menu.X+Menu.Width ||
  131.                    MouseVertical<Menu.Y ||
  132.                    MouseVertical>=Menu.Y+Menu.Height) &&
  133.                   ((MouseVertical!=SetY &&
  134.                     SetY<Menu.Y) ||
  135.                     SetY>=Menu.Y)) )
  136.             {
  137.               MouseInControl=1;
  138.               WasRemoved=1;
  139.               RemoveMenu();
  140.               return MenusRemoved;
  141.             }
  142.           }
  143.           else
  144.           {
  145.             if (MouseHorizontal<Menu.X ||
  146.                 MouseHorizontal>=Menu.X+Menu.Width ||
  147.                 MouseVertical<Menu.Y ||
  148.                 MouseVertical>=Menu.Y+Menu.Height)
  149.             {
  150.               RemoveMenu();
  151.               MouseInControl=0;
  152.               MenuItems &Menu=*SubMenuTrack[CurrentLevel-1];
  153.               PlaceOption(Menu.CurrentOption);
  154.               return MenusRemoved;
  155.             }
  156.           }
  157.         }
  158.  
  159.         return MenuEvent;
  160.       }
  161.  
  162.       if (MouseEvent&MouseLeftButtonRelease && CurrentLevel)
  163.       {
  164.         if (MouseHorizontal>=Menu.X
  165.             && MouseHorizontal<Menu.X+Menu.Width
  166.             && MouseVertical>Menu.Y
  167.             && MouseVertical<Menu.Y+Menu.Height-1)
  168.         {
  169.           MouseInControl=1;
  170.  
  171.           _Options &Option=*(Menu.Option+Menu.CurrentOption);
  172.  
  173.           if (!*Option.Available || !Option.Option)
  174.             return MenuEvent;
  175.  
  176.           if (Option.SubMenu && Option.SubMenu->Option)
  177.           {
  178.             PlaceMenu(*Option.SubMenu);
  179.             MenuItems &Menu=*Option.SubMenu;
  180.             _Options &Option=*(Menu.Option+Menu.CurrentOption);
  181.             if (!*Option.Available || !Option.Option)
  182.               FindNext();
  183.             MouseInControl=0;
  184.             return MenuEvent;
  185.           }
  186.  
  187.           if (*Option.Available && Option.Checked)
  188.           {
  189.             *Option.Checked=(*Option.Checked)?0:1;
  190.             Menu.ReCheckOption();
  191.           }
  192.           else
  193.             if (*Option.Available && Option.Selectables)
  194.             {
  195.               *Option.Selectable=(*Option.Selectable==Option.SelectCount-1)?0:(++(*Option.Selectable));
  196.               Menu.ReSelectOption();
  197.             }
  198.  
  199.           return Option.Event;
  200.         }
  201.       }
  202.  
  203.       if (CurrentLevel==1)
  204.       {
  205.         if ( ((MouseHorizontal<Menu.XStart ||
  206.                MouseHorizontal>Menu.XEnd) &&
  207.                MouseVertical==SetY &&
  208.                SetY<Menu.Y)
  209.  
  210.                ||
  211.  
  212.              ((MouseHorizontal<Menu.X ||
  213.                MouseHorizontal>=Menu.X+Menu.Width ||
  214.                MouseVertical<Menu.Y ||
  215.                MouseVertical>=Menu.Y+Menu.Height) &&
  216.               ((MouseVertical!=SetY &&
  217.                 SetY<Menu.Y) ||
  218.                 SetY>=Menu.Y)) )
  219.         {
  220.           MouseInControl=1;
  221.           WasRemoved=1;
  222.           RemoveMenu();
  223.         }
  224.  
  225.         else
  226.  
  227.         if (MouseHorizontal>Menu.X &&
  228.             MouseHorizontal<Menu.X+Menu.Width-1 &&
  229.             MouseVertical>Menu.Y &&
  230.             MouseVertical<Menu.Y+Menu.Height-1 &&
  231.             (MouseVertical-Menu.Y-1)!=Menu.CurrentOption)
  232.         {
  233.           RemoveOption();
  234.           PlaceOption(MouseVertical-Menu.Y-1);
  235.         }
  236.       }
  237.       else if (CurrentLevel>1)
  238.       {
  239.         if (MouseHorizontal<Menu.X ||
  240.             MouseHorizontal>=Menu.X+Menu.Width ||
  241.             MouseVertical<Menu.Y ||
  242.             MouseVertical>=Menu.Y+Menu.Height)
  243.         {
  244.           RemoveMenu();
  245.           MouseInControl=0;
  246.           MenuItems &Menu=*SubMenuTrack[CurrentLevel-1];
  247.           PlaceOption(Menu.CurrentOption);
  248.         }
  249.  
  250.         else
  251.  
  252.         if (MouseHorizontal>Menu.X &&
  253.             MouseHorizontal<Menu.X+Menu.Width-1 &&
  254.             MouseVertical>Menu.Y &&
  255.             MouseVertical<Menu.Y+Menu.Height-1 &&
  256.             (MouseVertical-Menu.Y-1)!=Menu.CurrentOption)
  257.         {
  258.           RemoveOption();
  259.           PlaceOption(MouseVertical-Menu.Y-1);
  260.         }
  261.       }
  262.  
  263.       if (!CurrentLevel)
  264.       {
  265.         for (register int i=0;i<NumberOfMenus;i++)
  266.         {
  267.           MenuItems &Menu=*Menus[i];
  268.  
  269.           if (MouseHorizontal>=Menu.XStart &&
  270.               MouseHorizontal<=Menu.XEnd &&
  271.               MouseVertical==SetY)
  272.           {
  273.             PlaceMenu(Menu);
  274.             return MenuEvent;
  275.           }
  276.         }
  277.       }
  278.  
  279.       return (CurrentLevel)?MenuEvent:((WasRemoved)?MenusRemoved:NothingEvent);
  280.     }
  281.     else
  282.     {
  283.       //--------------------------------------------------------------
  284.       //
  285.       // Pull down Mouse controller
  286.       //
  287.       //--------------------------------------------------------------
  288.  
  289.       if (!CurrentLevel)
  290.         MouseInControl=1;
  291.  
  292.       MenuItems &Menu=*SubMenuTrack[CurrentLevel-1];
  293.  
  294.       if (MouseEvent&MouseLeftButtonRelease && CurrentLevel==1 &&
  295.         !Menu.NumberOfOptions && MouseHorizontal>=Menu.XStart
  296.         && MouseHorizontal<=Menu.XEnd && MouseVertical==SetY
  297.         && Menu.MenuEvent)
  298.       {
  299.         RemoveMenu();
  300.         return(Menu.MenuEvent);
  301.       }
  302.  
  303. //      Smart call back logic removed from pull down menu system on 10/1/91
  304. //      to make the interface 100% SAA compliant.  Smart call backs only
  305. //      occur in the pop down menu system.  Do not uncomment this section
  306. //      as it isn't necessary any longer and just makes the use of pull down
  307. //      menus a little confusing if mouse and keyboard are comingled.
  308. //
  309. //      if (!MouseInControl && CurrentLevel)
  310. //      {
  311. //        MenuItems &Menu=*SubMenuTrack[CurrentLevel-1];
  312. //
  313. //        if (MouseHorizontal>=Menu.X
  314. //            && MouseHorizontal<Menu.X+Menu.Width
  315. //            && MouseVertical>Menu.Y
  316. //            && MouseVertical<Menu.Y+Menu.Height-1)
  317. //          MouseInControl=1;
  318. //        return MenuEvent;
  319. //      }
  320.  
  321.       if ((MouseEvent&MouseLeftButtonRelease || MouseEvent&MouseLeftButtonPress)
  322.         && CurrentLevel)
  323.       {
  324.         if (CurrentLevel)
  325.         {
  326.           if ((MouseHorizontal<Menu.X ||
  327.                MouseHorizontal>=Menu.X+Menu.Width ||
  328.                MouseVertical<Menu.Y ||
  329.                MouseVertical>=Menu.Y+Menu.Height))
  330.           {
  331.             if (CurrentLevel==1 && MouseHorizontal>=Menu.XStart &&
  332.                  MouseHorizontal<=Menu.XEnd &&
  333.                  MouseVertical==SetY &&
  334.                  SetY<Menu.Y)
  335.               return MenuEvent;
  336.  
  337.             RemoveMenu();
  338.             MouseInControl=1;
  339.             if (CurrentLevel)
  340.             {
  341.               MenuItems &Menu=*SubMenuTrack[CurrentLevel-1];
  342.               PlaceOption(Menu.CurrentOption);
  343.             }
  344.             return MenusRemoved;
  345.           }
  346.         }
  347.  
  348.         if (MouseHorizontal==Menu.X ||
  349.           MouseHorizontal==Menu.X+Menu.Width-1 ||
  350.           MouseVertical==Menu.Y ||
  351.           MouseVertical==Menu.Y+Menu.Height-1)
  352.           return MenuEvent;
  353.  
  354.         if (MouseHorizontal>=Menu.X
  355.             && MouseHorizontal<Menu.X+Menu.Width
  356.             && MouseVertical>Menu.Y
  357.             && MouseVertical<Menu.Y+Menu.Height-1
  358.             && MouseEvent&MouseLeftButtonRelease)
  359.         {
  360.           MouseInControl=1;
  361.  
  362.           RemoveOption();
  363.           PlaceOption(MouseVertical-Menu.Y-1);
  364.  
  365.           _Options &Option=*(Menu.Option+Menu.CurrentOption);
  366.  
  367.           if (!*Option.Available || !Option.Option)
  368.             return MenuEvent;
  369.  
  370.           if (Option.SubMenu && Option.SubMenu->Option)
  371.           {
  372.             PlaceMenu(*Option.SubMenu);
  373.             MenuItems &Menu=*Option.SubMenu;
  374.             _Options &Option=*(Menu.Option+Menu.CurrentOption);
  375.             if (!*Option.Available || !Option.Option)
  376.               FindNext();
  377.             MouseInControl=1;
  378.             return MenuEvent;
  379.           }
  380.  
  381.           if (*Option.Available && Option.Checked)
  382.           {
  383.             *Option.Checked=(*Option.Checked)?0:1;
  384.             Menu.ReCheckOption();
  385.           }
  386.           else
  387.             if (*Option.Available && Option.Selectables)
  388.             {
  389.               *Option.Selectable=(*Option.Selectable==Option.SelectCount-1)?0:(++(*Option.Selectable));
  390.               Menu.ReSelectOption();
  391.             }
  392.  
  393.           return Option.Event;
  394.         }
  395.       }
  396.  
  397.       if (CurrentLevel==1 && MouseButtonStatus&LeftButton)
  398.       {
  399.         if (MouseHorizontal<Menu.XStart ||
  400.             MouseHorizontal>Menu.XEnd &&
  401.             MouseVertical==SetY &&
  402.             SetY<Menu.Y)
  403.         {
  404.           RemoveMenu();
  405.           WasRemoved=1;
  406.         }
  407.  
  408.         else
  409.  
  410.         if (MouseHorizontal>Menu.X &&
  411.             MouseHorizontal<Menu.X+Menu.Width-1 &&
  412.             MouseVertical>Menu.Y &&
  413.             MouseVertical<Menu.Y+Menu.Height-1 &&
  414.             (MouseVertical-Menu.Y-1)!=Menu.CurrentOption)
  415.         {
  416.           RemoveOption();
  417.           PlaceOption(MouseVertical-Menu.Y-1);
  418.         }
  419.       }
  420.       else if (CurrentLevel>1 && MouseButtonStatus&LeftButton)
  421.       {
  422.         if (MouseHorizontal>Menu.X &&
  423.             MouseHorizontal<Menu.X+Menu.Width-1 &&
  424.             MouseVertical>Menu.Y &&
  425.             MouseVertical<Menu.Y+Menu.Height-1 &&
  426.             (MouseVertical-Menu.Y-1)!=Menu.CurrentOption)
  427.         {
  428.           RemoveOption();
  429.           PlaceOption(MouseVertical-Menu.Y-1);
  430.         }
  431.       }
  432.  
  433.       if (!CurrentLevel && MouseButtonStatus&LeftButton)
  434.       {
  435.         for (register int i=0;i<NumberOfMenus;i++)
  436.         {
  437.           MenuItems &Menu=*Menus[i];
  438.  
  439.           if (MouseHorizontal>=Menu.XStart &&
  440.               MouseHorizontal<=Menu.XEnd &&
  441.               MouseVertical==SetY)
  442.           {
  443.             PlaceMenu(Menu);
  444.             return MenuEvent;
  445.           }
  446.         }
  447.       }
  448.  
  449.       return (CurrentLevel)?MenuEvent:((WasRemoved)?MenusRemoved:NothingEvent);
  450.     }
  451.   }
  452.   else
  453.   {
  454.     //--------------------------------------------------------------
  455.     //
  456.     // Keyboard controller
  457.     //
  458.     //--------------------------------------------------------------
  459.  
  460.     switch(Event)
  461.     {
  462.       case kbLeft:
  463.         if (!CurrentLevel)
  464.           return NothingEvent;
  465.         if (NumberOfMenus==1)
  466.           return MenuEvent;
  467.  
  468.         RemoveAllMenus();
  469.  
  470.         int i=0;
  471.         for (i=0;i<NumberOfMenus;i++)
  472.           if (SubMenuTrack[0]==Menus[i])
  473.             break;
  474.  
  475.         i=(!i)?(NumberOfMenus-1):(--i);
  476.         PlaceMenu(*Menus[i]);
  477.         MouseInControl=0;
  478.  
  479.         {
  480.         MenuItems &Menu=*Menus[i];
  481.         _Options &Option=*(Menu.Option+Menu.CurrentOption);
  482.         if (!*Option.Available || !Option.Option)
  483.           FindNext();
  484.         }
  485.  
  486.         return MenuEvent;
  487.  
  488.       case kbRight:
  489.         if (!CurrentLevel)
  490.           return NothingEvent;
  491.         if (NumberOfMenus==1)
  492.           return MenuEvent;
  493.  
  494.         RemoveAllMenus();
  495.  
  496.         for (i=0;i<NumberOfMenus;i++)
  497.           if (SubMenuTrack[0]==Menus[i])
  498.             break;
  499.  
  500.         i=(i==NumberOfMenus-1)?0:(++i);
  501.         PlaceMenu(*Menus[i]);
  502.         MouseInControl=0;
  503.  
  504.         {
  505.         MenuItems &Menu=*Menus[i];
  506.         _Options &Option=*(Menu.Option+Menu.CurrentOption);
  507.         if (!*Option.Available || !Option.Option)
  508.           FindNext();
  509.         }
  510.  
  511.         return MenuEvent;
  512.  
  513.       case kbUp:
  514.         if (!CurrentLevel)
  515.           return NothingEvent;
  516.  
  517.         RemoveOption();
  518.         FindLast();
  519.  
  520.         return MenuEvent;
  521.  
  522.       case kbDown:
  523.         if (!CurrentLevel)
  524.           return NothingEvent;
  525.  
  526.         RemoveOption();
  527.         FindNext();
  528.  
  529.         return MenuEvent;
  530.  
  531.       case kbEsc:
  532.         if (!CurrentLevel)
  533.           return NothingEvent;
  534.  
  535.         RemoveMenu();
  536.  
  537.         if (CurrentLevel)
  538.         {
  539.           MouseInControl=0;
  540.           MenuItems &Menu=*SubMenuTrack[CurrentLevel-1];
  541.           PlaceOption(Menu.CurrentOption);
  542.         }
  543.         else
  544.           MouseInControl=1;
  545.  
  546.         return MenuEvent;
  547.  
  548.       case kbCr:
  549.         if (!CurrentLevel)
  550.           return NothingEvent;
  551.  
  552.         {
  553.           MenuItems &Menu=*SubMenuTrack[CurrentLevel-1];
  554.           _Options &Options=*(Menu.Option+Menu.CurrentOption);
  555.  
  556.           if (!Menu.NumberOfOptions)
  557.           {
  558.             if (CurrentLevel==1)
  559.               RemoveMenu();
  560.             return (!Menu.MenuEvent)?MenuEvent:Menu.MenuEvent;
  561.           }
  562.  
  563.           if (*Options.Available && Options.SubMenu && Options.SubMenu->Option)
  564.           {
  565.             PlaceMenu(*Options.SubMenu);
  566.             MenuItems &Menu=*Options.SubMenu;
  567.             _Options &Option=*(Menu.Option+Menu.CurrentOption);
  568.             if (!*Option.Available || !Option.Option)
  569.               FindNext();
  570.             MouseInControl=0;
  571.             return MenuEvent;
  572.           }
  573.  
  574.           if (*Options.Available && Options.Checked)
  575.           {
  576.             *Options.Checked=(*Options.Checked)?0:1;
  577.             Menu.ReCheckOption();
  578.           }
  579.           else
  580.             if (*Options.Available && Options.Selectables)
  581.             {
  582.               *Options.Selectable=(*Options.Selectable==Options.SelectCount-1)?0:(++(*Options.Selectable));
  583.               Menu.ReSelectOption();
  584.             }
  585.  
  586.           return (!*Options.Available || !Options.Option)?MenuEvent:Options.Event;
  587.         }
  588.  
  589.       default:
  590.  
  591.         //------------------------------------------------------------
  592.         //
  593.         // Check and see if a menu activation hot key was used
  594.         // Both global and localized window menus are checks
  595.         //
  596.         //------------------------------------------------------------
  597.  
  598.         for (i=0;i<NumberOfMenus;i++)
  599.         {
  600.           MenuItems &Menu=*Menus[i];
  601.           if (Menu.MenuHotKey==Event)
  602.           {
  603.             if (!Menu.NumberOfOptions)
  604.             {
  605.               RemoveAllMenus();
  606.               return (!Menu.MenuEvent)?MenuEvent:Menu.MenuEvent;
  607.             }
  608.  
  609.             _Options &Option=*(Menu.Option+Menu.CurrentOption);
  610.  
  611.             RemoveAllMenus();
  612.  
  613.             if (!IsWindow && NumberOfWindows && Window.CurrentLevel)
  614.               Window.RemoveAllMenus();
  615.             if (IsWindow && WorkSpace.CurrentLevel)
  616.               WorkSpace.RemoveAllMenus();
  617.  
  618.             PlaceMenu(Menu);
  619.             MouseInControl=0;
  620.             if (!*Option.Available || !Option.Option)
  621.               FindNext();
  622.             return MenuEvent;
  623.           }
  624.         }
  625.  
  626.         //------------------------------------------------------------
  627.         //
  628.         // See if an option quick key was pressed
  629.         //
  630.         //------------------------------------------------------------
  631.  
  632.         if (CurrentLevel)
  633.         {
  634.           MenuItems &Menu=*SubMenuTrack[CurrentLevel-1];
  635.           for (i=0;i<Menu.NumberOfOptions;i++)
  636.           {
  637.             Event-=(Event<255 && (islower(Event))?32:0);
  638.             _Options &Option=*(Menu.Option+i);
  639.             if (Option.QuickKey==Event)
  640.             {
  641.               if (!*Option.Available || !Option.Option)
  642.                 return MenuEvent;
  643.               RemoveOption();
  644.               PlaceOption(i);
  645.  
  646.               if (Option.SubMenu)
  647.               {
  648.                 PlaceMenu(*Option.SubMenu);
  649.                 MenuItems &Menu=*Option.SubMenu;
  650.                 _Options &Option=*(Menu.Option+Menu.CurrentOption);
  651.                 if (!*Option.Available || !Option.Option)
  652.                   FindNext();
  653.                 MouseInControl=0;
  654.                 return MenuEvent;
  655.               }
  656.     
  657.               if (*Option.Available && Option.Checked)
  658.               {
  659.                 *Option.Checked=(*Option.Checked)?0:1;
  660.                 Menu.ReCheckOption();
  661.               }
  662.               else
  663.                 if (*Option.Available && Option.Selectables)
  664.                 {
  665.                   *Option.Selectable=(*Option.Selectable==Option.SelectCount-1)?0:(++(*Option.Selectable));
  666.                   Menu.ReSelectOption();
  667.                 }
  668.  
  669.               return Option.Event;
  670.             }
  671.           }
  672.         }
  673.  
  674.         //------------------------------------------------------------
  675.         //
  676.         // See if a menu hot key was pressed
  677.         //
  678.         //------------------------------------------------------------
  679.  
  680.         int Saved;
  681.  
  682.         for (i=0;i<NumberOfMenus;i++)
  683.         {
  684.           if (Saved=Menus[i]->ScanMenu(Event),Saved)
  685.             break;
  686.         }
  687.  
  688.         if (Saved)
  689.         {
  690.           RemoveAllMenus();
  691.           if (!IsWindow && NumberOfWindows && Window.CurrentLevel)
  692.             Window.RemoveAllMenus();
  693.           if (IsWindow && WorkSpace.CurrentLevel)
  694.             WorkSpace.RemoveAllMenus();
  695.           return Saved;
  696.         }
  697.  
  698.         return NothingEvent;
  699.     }
  700.   }
  701. }
  702.  
  703.